home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / dev / c / MemPools1_2.lha / mempools / init.c < prev    next >
C/C++ Source or Header  |  1995-05-22  |  3KB  |  145 lines

  1. /**
  2. ***  MemPools:  malloc() replacement using standard Amiga pool functions.
  3. ***  Copyright  (C)  1994    Jochen Wiedmann
  4. ***
  5. ***  This program is free software; you can redistribute it and/or modify
  6. ***  it under the terms of the GNU General Public License as published by
  7. ***  the Free Software Foundation; either version 2 of the License, or
  8. ***  (at your option) any later version.
  9. ***
  10. ***  This program is distributed in the hope that it will be useful,
  11. ***  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ***  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ***  GNU General Public License for more details.
  14. ***
  15. ***  You should have received a copy of the GNU General Public License
  16. ***  along with this program; if not, write to the Free Software
  17. ***  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ***
  19. ***
  20. ***  This file contains the initialization stuff.
  21. ***
  22. ***
  23. ***  Computer:  Amiga 1200
  24. ***
  25. ***  Compilers: Dice 3.01
  26. ***             SAS/C 6.50
  27. ***             gcc 2.6.1
  28. ***
  29. ***
  30. ***  Author:    Jochen Wiedmann
  31. ***             Am Eisteich 9
  32. ***       72555 Metzingen
  33. ***             Germany
  34. ***
  35. ***             Phone: (0049) 7123 14881
  36. ***             Internet: jochen.wiedmann@uni-tuebingen.de
  37. **/
  38.  
  39.  
  40. /***************************************************************************
  41. ***
  42. ***  This file uses the auto initialization possibilities of Dice, gcc and
  43. ***  SAS/C, respectively.
  44. ***
  45. ***  Dice does this by using the keywords __autoinit and __autoexit, SAS
  46. ***  uses names beginning with _STI or _STD, respectively. gcc uses the
  47. ***  asm() instruction, to emulate C++ constructors and destructors.
  48. ***
  49. ***************************************************************************/
  50.  
  51.  
  52. /*
  53.     Include files and compiler specific stuff
  54. */
  55. #include <stdlib.h>
  56. #include <exec/types.h>
  57. #include <clib/alib_protos.h>
  58.  
  59. #include "mempools.h"
  60.  
  61.  
  62.  
  63. #if defined(__SASC)  ||  defined(__GNUC__)
  64. #define __autoinit
  65. #define __autoexit
  66. #elif !defined(_DCC)
  67. #error "Don't know how to handle your compiler."
  68. #endif
  69.  
  70.  
  71. #ifdef DEBUG
  72. const char meatBeaf[40] = {
  73.     'M', 'E', 'A', 'T', 'B', 'E', 'A', 'F',
  74.     'M', 'E', 'A', 'T', 'B', 'E', 'A', 'F',
  75.     'M', 'E', 'A', 'T', 'B', 'E', 'A', 'F',
  76.     'M', 'E', 'A', 'T', 'B', 'E', 'A', 'F',
  77.     'M', 'E', 'A', 'T', 'B', 'E', 'A', 'F',
  78. };
  79. struct MinList memList;
  80. #endif
  81.  
  82. APTR __MemPool;
  83.  
  84.  
  85.  
  86. #ifndef DEBUG
  87. STATIC
  88. #endif
  89. __autoinit LONG _STIInitMemFunctions(VOID)
  90.  
  91. {
  92. #ifdef DEBUG
  93.     NewList((struct List *) &memList);
  94. #endif
  95.     if (!(__MemPool = LibCreatePool(__MemPoolFlags,
  96.                     __MemPoolPuddleSize,
  97.                     __MemPoolThreshSize))) {
  98. #if defined(__SASC)
  99.     return(TRUE);
  100. #elif defined(_DCC)
  101.     extern VOID _AutoFail0(VOID);
  102.     _AutoFail0();
  103. #elif defined(__GNUC__)
  104.     abort();
  105. #endif
  106.     }
  107.  
  108.     return(FALSE);
  109. }
  110.  
  111.  
  112. #ifndef DEBUG
  113. STATIC
  114. #endif
  115. __autoexit VOID _STDTerminateMemFunctions(VOID)
  116.  
  117. {
  118. #ifdef DEBUG
  119.     /*  Be safe, that all memory blocks are checked by calling  */
  120.     /*  free() on them.                                         */
  121.     static int called = FALSE;  /*  Be reentrant.   */
  122.  
  123.     if (!called) {
  124.     memBlock *block;
  125.  
  126.     called = TRUE;
  127.     block = (memBlock *) memList.mlh_Head;
  128.     while (block->node.mln_Succ) {
  129.         free(block+1);
  130.     }
  131.     }
  132. #endif
  133.  
  134.     if (__MemPool)
  135.     { LibDeletePool(__MemPool);
  136.       __MemPool = NULL;
  137.     }
  138. }
  139.  
  140.  
  141. #if defined(__GNUC__)
  142. __asm ("  .text;  .stabs \"___CTOR_LIST__\",22,0,0,__STIInitMemFunctions");
  143. __asm ("  .text;  .stabs \"___DTOR_LIST__\",22,0,0,__STDTerminateMemFunctions");
  144. #endif
  145.